Python:如何使ANSI转义码在Windows中也能工作?

您所在的位置:网站首页 python /x1b Python:如何使ANSI转义码在Windows中也能工作?

Python:如何使ANSI转义码在Windows中也能工作?

2024-07-15 23:14| 来源: 网络整理| 查看: 265

如果我在linux下的python中运行它,它将起作用:

123start ="\\033[1;31m" end ="\\033[0;0m" print"File is:" + start +"" + end

但是,如果我在Windows上运行它不起作用,如何使ANSI转义码在Windows上也起作用?

相关讨论 请参阅stackoverflow.com/questions/8358533/(如果有用) 当\ 33是同一东西时,为什么还要使用\ 033? @这是bash的工作方式\\0xx translates to the octal ASCII equivalent of 0nn, where nn is a string of digits,033八进制表示27(十进制),即转义码 我没有问\ 033是什么意思,您也没有回答我的问题。 这很简单。 再读一遍。 (那么,病态会帮助您:尝试在Python中同时使用\ 033和\ 33。难道它们都以相同的方式工作吗?) @Apostolos它们是相同的,但是由于重击,我习惯使用\ 033。 \ 0并且以0开头在许多语言中对于八进制都是显式的,具有描述性,不会造成混淆

您可以检查Python模块以在Windows上为stdout启用ANSI颜色吗?看看它是否有用。

colorama模块似乎是跨平台的。

您安装colorama:

1pip install colorama

然后:

12345import colorama colorama.init() start ="\\033[1;31m" end ="\\033[0;0m" print"File is:" + start +"" + end 相关讨论 它与colorama一起使用,我编辑了答案以包含完整的代码。 当\ 33是同一东西时,为什么还要使用\ 033? @Apostolos Escape是代码27我认为\ 033为八进制并转换为27

如果您使用的是Win 10(在cmd中具有本机ANSI支持),则似乎存在一个错误,该错误在Python 3.7中被标记为已解决(尽管看上去并没有实际修复)。

一种解决方法是在打印之前添加subprocess.call('', shell=True)。

相关讨论 我可以确认该变通办法工作正常,但是您知道为什么会起作用吗? @Joost不记得了,但是我认为bugs.python.org/issue30075有一些解释。 另一个(较短的)解决方法是os.system(),我想它的内部效果相同

这是我长期以来寻求的解决方案。只需使用标准库中的ctypes模块。默认情况下,它仅在Windows上与Python 3.x一起安装。因此,在使用操作系统之前,请先检查该操作系统是否为Windows(例如,使用platform.system)。

12345from platform import system if"win" in system().lower(): # works for Win7, 8, 10 ...     from ctypes import windll     k = windll.kernel32     k.SetConsoleMode(k.GetStdHandle(-11), 7)

完成此操作后,就可以像使用Unix操作系统一样使用ASCII特殊字符(例如\\x1b[31m,表示红色):

12message ="ERROR" print(f"\\x1b[31m{message}\\x1b[0m")

我喜欢此解决方案,因为它不需要安装模块(例如colorama或termcolor)。

相关讨论 究竟!这是程序员应该思考的正确,有效的方法! (当可以使用内置模块解决问题时,使用额外软件包解决问题的人数令人惊讶!)

您可以看看https://github.com/kennethreitz/clint

从自述文件:

123456>>> from clint.textui import colored, puts >>> puts(colored.red('red text')) red text # It's red in Windows, OSX, and Linux alike. 相关讨论 如果我要使用标准库随附的Id之类的东西。 您仍然可以查看源代码。它在幕后使用了colarama,它基本上包装了sys.stdout.write来替换转义序列。 如果可以使用标准库完成某些事情,则安装特殊模块。解决方案不正确!

对于Windows,调用os.system(" color")可使ANSI转义序列得到正确处理:

123456789101112import os os.system("color") COLOR = {    "HEADER":"\\033[95m",    "BLUE":"\\033[94m",    "GREEN":"\\033[92m",    "RED":"\\033[91m",    "ENDC":"\\033[0m", } print(COLOR["GREEN"],"Testing Green!!", COLOR["ENDC"]) 相关讨论 好的答案,因为它确实需要安装新的模块

根据互联网上成千上万的精美答案,发送ANSI转义序列应该可以工作,但是一个晦涩的细节花了我半天的时间才发现。诀窍是必须设置某个注册表项。我正在使用(仅适用于今天)Windows 10 Enterprise版本1709,内部版本16299。

在HKEY_CURRENT_USER中的控制台下,在TrimLeadingZeros和WindowAlpha之间,应该有VirtualTerminalLevel。如果不存在,请继续创建它。这是REG_DWORD。将其值设置为1。打开一个新的终端,运行Python,然后开始玩。

1print("\\033[48;2;255;140;60m ORANGE BACKGROUND \\033[48;2;0;0;0m")

请参阅https://github.com/ytdl-org/youtube-dl/issues/15758以了解比我了解更多的人的东西。

现在,如果我能记得为什么我要为Python程序的输出着色...

尝试在此处\\033[;添加分号,如果没有该分号,我会得到不希望的效果。

12start ="\\033[;1;31m" end ="\\033[;0;0m"

我编写了一个简单的模块,可从以下网站获得:http://pypi.python.org/pypi/colorconsole

它适用于Windows,Mac OS X和Linux。它在Linux和Mac上使用ANSI,但在Windows上原生调用控制台功能。您有颜色,光标位置和键盘输入。它不是诅咒的替代品,但是如果您需要在简单的脚本或ASCII游戏中使用,它将非常有用。

可以在以下位置找到该文档:http://code.google.com/p/colorconsole/wiki/PageName

PS:这与使用Python使用颜色在终端中打印的答案相同?但是我不知道如何链接到回复。

您可以这样做:

12import os os.system("")

这对我有用。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3